package cn.com.dashihui.web;

import java.util.Map;
import java.util.Properties;

import com.google.common.collect.Maps;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.Const;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.ext.plugin.shiro.ShiroInterceptor;
import com.jfinal.ext.plugin.shiro.ShiroPlugin;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;

import cn.com.dashihui.qrcode.ApiConfig;
import cn.com.dashihui.qrcode.ApiConfigKit;
import cn.com.dashihui.web.controller.APIController;
import cn.com.dashihui.web.controller.AdController;
import cn.com.dashihui.web.controller.AdminController;
import cn.com.dashihui.web.controller.AuthDownloadController;
import cn.com.dashihui.web.controller.CategoryController;
import cn.com.dashihui.web.controller.GoodsBaseController;
import cn.com.dashihui.web.controller.GoodsSaleSpecController;
import cn.com.dashihui.web.controller.GoodsSaleTemplateController;
import cn.com.dashihui.web.controller.GoodsStoreController;
import cn.com.dashihui.web.controller.OrderController;
import cn.com.dashihui.web.controller.OrderEvalController;
import cn.com.dashihui.web.controller.ResourceController;
import cn.com.dashihui.web.controller.RoleController;
import cn.com.dashihui.web.controller.SMSController;
import cn.com.dashihui.web.controller.SellerController;
import cn.com.dashihui.web.controller.SendSellerController;
import cn.com.dashihui.web.controller.StoreController;
import cn.com.dashihui.web.controller.StoreTongController;
import cn.com.dashihui.web.controller.SysConfigController;
import cn.com.dashihui.web.controller.SystemController;
import cn.com.dashihui.web.controller.UserController;
import cn.com.dashihui.web.controller.UserMoneyController;
import cn.com.dashihui.web.dao.Ad;
import cn.com.dashihui.web.dao.AdminSeller;
import cn.com.dashihui.web.dao.AuthDownload;
import cn.com.dashihui.web.dao.Category;
import cn.com.dashihui.web.dao.City;
import cn.com.dashihui.web.dao.DetailsImg;
import cn.com.dashihui.web.dao.DiXian;
import cn.com.dashihui.web.dao.Feedback;
import cn.com.dashihui.web.dao.GbOrder;
import cn.com.dashihui.web.dao.GoodsBase;
import cn.com.dashihui.web.dao.GoodsBaseImages;
import cn.com.dashihui.web.dao.GoodsItem;
import cn.com.dashihui.web.dao.GoodsSale;
import cn.com.dashihui.web.dao.GoodsSaleGT;
import cn.com.dashihui.web.dao.GoodsSaleItem;
import cn.com.dashihui.web.dao.GoodsSaleOption;
import cn.com.dashihui.web.dao.GoodsSaleSpec;
import cn.com.dashihui.web.dao.GoodsSaleTemplate;
import cn.com.dashihui.web.dao.GoodsSpec;
import cn.com.dashihui.web.dao.GoodsStore;
import cn.com.dashihui.web.dao.GoodsStoreRel;
import cn.com.dashihui.web.dao.GoodsToker;
import cn.com.dashihui.web.dao.Logistics;
import cn.com.dashihui.web.dao.Order;
import cn.com.dashihui.web.dao.OrderLog;
import cn.com.dashihui.web.dao.OrderLogistics;
import cn.com.dashihui.web.dao.OrderRefund;
import cn.com.dashihui.web.dao.OrderRefundAPIRecord;
import cn.com.dashihui.web.dao.Refound;
import cn.com.dashihui.web.dao.Resource;
import cn.com.dashihui.web.dao.Role;
import cn.com.dashihui.web.dao.SMS;
import cn.com.dashihui.web.dao.Seller;
import cn.com.dashihui.web.dao.SendSeller;
import cn.com.dashihui.web.dao.Store;
import cn.com.dashihui.web.dao.StoreAd;
import cn.com.dashihui.web.dao.StoreImages;
import cn.com.dashihui.web.dao.SysConfig;
import cn.com.dashihui.web.dao.User;
import cn.com.dashihui.web.dao.UserMoney;
import cn.com.dashihui.web.dao.UserValueLog;
import cn.com.dashihui.web.handler.ContextParamsHandler;
import cn.com.dashihui.web.handler.SessionHandler;

public  class Config extends JFinalConfig {
	
	private Routes routes;
	
	@Override
	public void configConstant(Constants me) {
		// 如果生产环境配置文件存在，则优先加载该配置，否则加载开发环境配置文件

//		loadPropertyFile("config.local.properties");//本地
		loadPropertyFile("config.properties");//本地线上联调
//		loadPropertyFile("config.test.properties");//模拟服务器
//		loadPropertyFile("config.server.properties");//服务器



		//设置字符集
		me.setEncoding("UTF-8");
		me.setViewType(ViewType.JSP);
		//上传文件大小
		me.setMaxPostSize(100*Const.DEFAULT_MAX_POST_SIZE);
		//调试模式，会打印详细日志
		me.setDevMode(getPropertyToBoolean("constants.devMode", false));
		//上传文件配置
		//注：此处的目录是上级目录，真正在Controller中获取上传的文件时，需要指定（也可以不指定）要将文件移到什么目录下（）相对于此处指定的目录
		//比如在此设置目录为<E:/>，而在Controller中<getFile("fileName","upload")>，则会将文件移至<E:/upload>目录中，如果不指定则移至<E:/>目录中
		
//		me.setBaseDownloadPath(PathKit.getWebRootPath()+File.separator+"upload");
//		OreillyCos.init(PathKit.getWebRootPath()+File.separator+"upload", 10*1024*1024, "UTF-8");
		//出错跳转页面
		me.setError401View("/WEB-INF/page/401.jsp");
		me.setError403View("/WEB-INF/page/403.jsp");
		me.setError404View("/WEB-INF/page/404.jsp");
		me.setError500View("/WEB-INF/page/500.jsp");
	}
	
	/**
	 * 重写父类方法
	 */
	@Override
	public Properties loadPropertyFile(String fileName) {
		PropKit.useFirstFound(fileName); 
		return loadPropertyFile(fileName, Const.DEFAULT_ENCODING);
	}
	@Override
	public void configRoute(Routes me) {
		this.routes = me;
		//设置视图根目录
		me.setBaseViewPath("/WEB-INF/page");
		//api
		me.add("/api",APIController.class);
		//权限系列
		me.add("/", SystemController.class);
		me.add("/auth/admin", AdminController.class);
		me.add("/auth/role", RoleController.class);
		me.add("/auth/resource", ResourceController.class);
		/*	
		 * //字典系列
		me.add("/dict/city", CityController.class);
		me.add("/dict/brand", BrandController.class);
		me.add("/dict/category", CategoryController.class);
		me.add("/dict/community", CommunityController.class);
		me.add("/dict/store", StoreController.class);
		*/
		//商品管理
		me.add("/bus/ad", AdController.class);
		me.add("/bus/goods/base",GoodsBaseController.class);
		me.add("/bus/goods/spec",GoodsSaleSpecController.class);
		me.add("/bus/goods/template",GoodsSaleTemplateController.class);
		me.add("/bus/goods/store",GoodsStoreController.class);
		me.add("/dict/category", CategoryController.class);
		me.add("/bus/order",OrderController.class);
		me.add("/bus/order/eval",OrderEvalController.class);
		//公司管理
		me.add("/dict/store", StoreController.class);
		me.add("/dict/seller", SellerController.class);
		me.add("/dict/sendseller", SendSellerController.class);
		me.add("/dict/store/tong", StoreTongController.class);
		me.add("/bus/user", UserController.class);


		//系统设置
		/*me.add("/sys/version",VersionController.class);
		me.add("/sys/feedback",FeedbackController.class);*/
		me.add("/sys/config",SysConfigController.class);
		me.add("/sys/sms",SMSController.class);
		/*//日志
		me.add("/log/keyword",LogKeywordController.class);*/
		//钱包明细
		me.add("/bus/money", UserMoneyController.class);
		//登录下载统计
		me.add("/auth/authDownload", AuthDownloadController.class);
	}
	
	@Override
	public void configPlugin(Plugins me) {
		//缓存
		EhCachePlugin ecp = new EhCachePlugin();
		me.add(ecp);
		// 配置C3p0数据库连接池插件
		C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("db.jdbcUrl"), getProperty("db.username"), getProperty("db.password"), getProperty("db.jdbcDriver"));
		c3p0Plugin.setMaxPoolSize(getPropertyToInt("db.maxPoolSize"));
		c3p0Plugin.setMinPoolSize(getPropertyToInt("db.minPoolSize"));
		c3p0Plugin.setInitialPoolSize(getPropertyToInt("db.initialPoolSize"));
		c3p0Plugin.setMaxIdleTime(getPropertyToInt("db.maxIdleTime"));
		c3p0Plugin.setAcquireIncrement(getPropertyToInt("db.acquireIncrement"));
		me.add(c3p0Plugin);
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp_mysql = new ActiveRecordPlugin(c3p0Plugin);
		arp_mysql.setDialect(new MysqlDialect());
		//忽略大小写
		//arp_mysql.setContainerFactory(new CaseInsensitiveContainerFactory());
		arp_mysql.setShowSql(true);
		me.add(arp_mysql);

		/**
		 * sqlserver
		 */
//		C3p0Plugin sqlserver = new C3p0Plugin(getProperty("sqlserver.db.jdbcUrl"), getProperty("sqlserver.db.username"), getProperty("sqlserver.db.password"), getProperty("sqlserver.db.jdbcDriver"));
//		sqlserver.setMaxPoolSize(getPropertyToInt("sqlserver.db.maxPoolSize"));
//		sqlserver.setMinPoolSize(getPropertyToInt("sqlserver.db.minPoolSize"));
//		sqlserver.setInitialPoolSize(getPropertyToInt("sqlserver.db.initialPoolSize"));
//		sqlserver.setMaxIdleTime(getPropertyToInt("sqlserver.db.maxIdleTime"));
//		sqlserver.setAcquireIncrement(getPropertyToInt("sqlserver.db.acquireIncrement"));
//		me.add(sqlserver);
//		ActiveRecordPlugin arp_mysql_sqlserver = new ActiveRecordPlugin("sqlserver", sqlserver);
//		arp_mysql_sqlserver.setDialect(new AnsiSqlDialect());
//		me.add(arp_mysql_sqlserver);
		
		
		//添加model映射
		arp_mysql.addMapping("t_auth_admin_seller", AdminSeller.class);
		arp_mysql.addMapping("t_auth_roles_seller", Role.class);
		arp_mysql.addMapping("t_auth_resources_seller", Resource.class);
		arp_mysql.addMapping("t_dict_city", City.class);
		arp_mysql.addMapping("t_dict_category","categoryId", Category.class);
		arp_mysql.addMapping("t_dict_store", Store.class);
		arp_mysql.addMapping("t_dict_sendseller", SendSeller.class);
		arp_mysql.addMapping("t_dict_logistics", Logistics.class);
		arp_mysql.addMapping("t_bus_order_logistics", OrderLogistics.class);
		arp_mysql.addMapping("t_bus_ad", Ad.class);
		arp_mysql.addMapping("t_bus_store_ad", StoreAd.class);
		arp_mysql.addMapping("t_bus_goods_base", GoodsBase.class);
		arp_mysql.addMapping("t_bus_goods_base_images", GoodsBaseImages.class);
		arp_mysql.addMapping("t_bus_goods", GoodsStore.class);
		//arp_mysql.addMapping("t_bus_goods_images", GoodsStoreImages.class);
		arp_mysql.addMapping("t_bus_store_images", StoreImages.class);
		arp_mysql.addMapping("t_bus_goods_item", GoodsItem.class);
		//SKU相关
		arp_mysql.addMapping("t_bus_goods_sale", GoodsSale.class);
		arp_mysql.addMapping("t_bus_goods_sale_spec", GoodsSaleSpec.class);
		arp_mysql.addMapping("t_bus_goods_sale_template", GoodsSaleTemplate.class);
		arp_mysql.addMapping("t_bus_goods_sale_option", GoodsSaleOption.class);
		arp_mysql.addMapping("t_bus_goods_sale_items", GoodsSaleItem.class);
		arp_mysql.addMapping("t_bus_goods_sale_gt", GoodsSaleGT.class);
		
		//商品规格t_dict_logistics
		arp_mysql.addMapping("t_bus_goods_spec", GoodsSpec.class);
		arp_mysql.addMapping("goods_details_images", DetailsImg.class);
		arp_mysql.addMapping("t_bus_goods_store_rel", GoodsStoreRel.class);
		arp_mysql.addMapping("t_bus_user", User.class);
		arp_mysql.addMapping("t_bus_order", Order.class);
		//团购订单
		arp_mysql.addMapping("t_bus_order_gb", GbOrder.class);
		//退款
		arp_mysql.addMapping("t_bus_order_refund", Refound.class);
		arp_mysql.addMapping("t_bus_order_log", OrderLog.class);
		arp_mysql.addMapping("t_bus_order_refund", OrderRefund.class);
		arp_mysql.addMapping("t_bus_order_refund_apirecord", OrderRefundAPIRecord.class);
		arp_mysql.addMapping("t_bus_seller", Seller.class);
		arp_mysql.addMapping("t_dict_store_dixian", DiXian.class);
		arp_mysql.addMapping("t_bus_user_value_log", UserValueLog.class);
		arp_mysql.addMapping("t_sys_feedback", Feedback.class);
		arp_mysql.addMapping("t_sys_config", SysConfig.class);
		arp_mysql.addMapping("t_sys_sms", SMS.class);
		//商品拓客信息
		arp_mysql.addMapping("t_bus_goods_toker", GoodsToker.class);
		//登录下载统计
		arp_mysql.addMapping("t_auth_download", AuthDownload.class);
		//钱包明细
		arp_mysql.addMapping("t_bus_user_money", UserMoney.class);
		//shiro权限框架，添加到plugin
		ShiroPlugin shiroPlugin = new ShiroPlugin(this.routes);
		shiroPlugin.setLoginUrl("/login");
		shiroPlugin.setSuccessUrl("/index");
		shiroPlugin.setUnauthorizedUrl("/error403");
		me.add(shiroPlugin);
	}
	
	@Override
	public void configInterceptor(Interceptors me) {
		me.add(new SessionInViewInterceptor());
		me.add(new ShiroInterceptor());
	}
	
	@Override
	public void configHandler(Handlers me) {
		//可在此设置context_path，解决http://ip:port/context_path的问题
		//因为测试时是在jetty下，所以默认没有context_path，如果部署在tomcat下，会自动加上项目名，所以会用到该配置
		//可自定义context_path，默认下是CONTEXT_PATH，使用如：${CONTEXT_PATH}
		me.add(new ContextPathHandler("BASE_PATH"));
		//需要在页面传递的常量
		Map<String,Object> params = Maps.newHashMap();
		params.put("FTP_PATH", PropKit.get("constants.ftppath"));
		me.add(new ContextParamsHandler(params));
		me.add(new SessionHandler());
	}
	@Override
	public void afterJFinalStart() {
		super.afterJFinalStart();
		//初始化时缓存公众号参数
				ApiConfig ac = new ApiConfig();
				// 配置微信 API 相关常量
				ac.setToken(PropKit.get("wx.token"));
				ac.setAppId(PropKit.get("wx.appId"));
				ac.setAppSecret(PropKit.get("wx.appSecret"));
				ApiConfigKit.setApiConfig(ac);
		/**
		 *  是否对消息进行加密，对应于微信平台的消息加解密方式：
		 *  1：true进行加密且必须配置 encodingAesKey
		 *  2：false采用明文模式，同时也支持混合模式
		 */
		//定时任务 同步数据
//		SynchronizationDate task = new SynchronizationDate();
//		OrgainReviewTurnDownedTask turndownTask = new OrgainReviewTurnDownedTask();
        // Creates the scheduler.
//        ScheduledThreadPoolExecutor taskScheduler = new ScheduledThreadPoolExecutor(1);
//        if(!PropKit.getBoolean("constants.devMode")){
//        	taskScheduler.scheduleAtFixedRate(task, 0, 3600, TimeUnit.SECONDS);
//        	taskScheduler.scheduleAtFixedRate(turndownTask, 0, 30, TimeUnit.SECONDS);
//          }
	}

	@Override
	public void configEngine(Engine arg0) {
		// TODO Auto-generated method stub
		
	}
}
